import { webxDictStore } from "../store/webxDict.store";
import { ref } from "vue";

export default function useWebxDict() {

  // 字典加载状态
  const loading = ref(false);

  // 拼接dictType
  const getFullDictType = (dictType: string) => {
    if(dictType.startsWith("dict-")) {
      return dictType;
    } else {
      return "dict-" + dictType;
    }
  }

  /**
   * 初始化字典，加载最少3秒，3秒结束，数据还未加载完成，等待至加载完成
   * */
  const init = async (initOptions:WebxDictInitOptions) => {
    try {
      const store = webxDictStore();
      // 获取更新的字典类型列表
      const dictTypeList = await initOptions.api.getUpdateDictTypeList(store.updateDate);
      loading.value = !!dictTypeList.length;
      // 获取更新的字典值列表
      const [updateDictList] = await fetchWithMinDelay([
        initOptions.api.getUpdateDictDataList(dictTypeList)
      ]);
      store.setUpdateDate();
      store.setDataSource(updateDictList.value);
      loading.value = false;
    } catch (e) {
      loading.value = false;
    }
  }

  // 根据dictType字典值列表
  const getList = (dictType: string) => {
    dictType = getFullDictType(dictType);
    const store = webxDictStore();
    return (store.dataSource[dictType] || []).map((dict:DictData) => ({
      ...dict,
      label: dict.dictLabel,
      value: dict.dictValue
    }));
  }

  // 根据dictType和dictValue返回字典值详情
  const getDict = (dictType: string, dictValue: string) => {
    dictType = getFullDictType(dictType);
    const store = webxDictStore();
    const dictList = store.dataSource[dictType] || [];
    return dictList.find((dict:DictData) => dict.dictValue === dictValue);
  }

  // 根据dictType和dictValue返回dictLabel
  const getLabel = (dictType: string, dictValue: string) => {
    dictType = getFullDictType(dictType);
    const dict = getDict(dictType, dictValue);
    return dict?.dictLabel || "";
  }

  return { loading, init, getList, getDict, getLabel };
}

/**
 * 发起请求并保证最小延迟时间
 * @param {Promise<any>[]} requests - 接口请求的Promise数组
 * @returns {Promise} 返回一个Promise，解析值为所有请求的结果数组（包含状态和值/原因）
 */
async function fetchWithMinDelay(requests: Promise<any>[]): Promise<any> {
  // 1. 记录请求开始时间
  const startTime = Date.now();

  // 2. 创建所有请求的聚合Promise（使用allSettled确保不因单个失败而中断）
  const requestsPromise = Promise.allSettled(requests);

  // 3. 创建最小延迟的Promise（3秒）
  const minDelayPromise = new Promise(resolve =>
    setTimeout(resolve, 3000)
  );

  // 4. 核心逻辑：先等待最小延迟，再根据请求状态决定是否继续等待
  await minDelayPromise;
  const elapsed = Date.now() - startTime;
  if (elapsed >= 3000) {
    // 情况1：已满3秒，直接返回请求结果（无论完成与否）
    return requestsPromise;
  } else {
    // 情况2：未满3秒（可能提前完成），计算剩余时间并等待
    const remainingDelay = 3000 - elapsed;
    return new Promise(resolve => {
      setTimeout(() => resolve(requestsPromise), remainingDelay);
    });
  }
}

// 初始化字典入参
export declare interface WebxDictInitOptions {
  api:{
    // 获取更新的字典类型列表
    getUpdateDictTypeList:(update:string) => Promise<any[]>;
    // 获取更新的字典值列表
    getUpdateDictDataList:(dictTypeList:any[]) => Promise<{
      // [更新的字典类型]:更新的字典类型对应值列表
      [dictType:string]:any[];
    }>;
  }
}

// 字典数据
export declare interface DictData {
  [key:string]: any;
}